<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // function fn(){
        //     const timer = Math.floor(Math.random()*4000+1000);
        //     const p = new Promise(function(resolve,reject){
        //         if(timer>=3000){
        //             resolve(timer)
        //         }
        //         else{
        //             reject(new Error('错误'))
        //         }
        //     });

        //     return p;
        // }

        // const p1 = fn();

        // p1.then(function(e){
        //     console.log(e)
        // })

        // p1.catch(function(error){
        //     console.log(error.message)
        // })



        // async function fn2(){
        //     // const res1 = await fn1(); // await 捕获成功的状态  
        //     // 错误的状态 采用 try catch 手动捕获
        //     try{
        //         const res1 = await fn1();
        //     }catch(e){
        //         console.log(e.message);
        //     }
            
        // }

        // promise  pending   fulfilled rejected 
        /// pending => fulfilled
        // pending => rejected
        
        // 不完整的伪代码 
        class Promise{
            constructor(fn){
                this.status = 'pending'; // 准备一个状态 默认是pending
                // 准备两个集合  
                // 一个用来记录成功的回调  fulfilled
                // 一个用来记录失败  rejected
                // this.fulfilled_list = [fn1,fn2,fn3];
                this.fulfilled_list = []; // 当状态变成成功  
                // 这里边的方法 挨个执行  

                //this.rejected_list = [fn1,fn2,fn3];
                this.rejected_list = [];


                fn(this.resolve_fn1,this.reject_fn1);
            }

            resolve_fn1(res){
                this.status = 'fulfilled';
                this.fulfilled_list.forEach(item=>{
                    item(res)
                })
            }


            reject_fn1(res){
                this.status = 'rejected';
                this.rejected_list.forEach(item=>{
                    item(res)
                })
            }


            then_fn2(fn){
                this.fulfilled_list.push(fn);
            }

            catch_fn2(fn){
                this.rejected_list.push(fn);
            }

        }


        const p = new Promise(function(resolve,reject){
            setTimeout(()=>{
                resolve('haha')
            },3000)
        })


        p.then_fn2(function(val){console.log(val)});
        // 把 function(val){console.log(val)} 加入到this.fulfilled_list 
        // 集合 
        p.catch_fn2(function(){});
        // 把 function(){console.log(val)} 加入到this.rejected_list 
        // 集合 
    </script>
</body>
</html>